package com.cmict.data.form.api.service;

import com.cmict.data.framework.common.pojo.CommonResult;
import com.cmict.data.framework.common.pojo.PageResult;
import com.cmict.data.form.api.entity.BpmForm;
import com.cmict.data.form.api.entity.dataobject.SysFormDO;
import com.cmict.data.form.api.entity.dataobject.SysFormItemRespVO;
import com.cmict.data.form.api.entity.vo.SysFormReqVO;
import com.cmict.data.system.api.permission.dto.MenuDTO;

import javax.validation.Valid;
import java.text.ParseException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 表单表
 *
 * @author
 * @date 2022-03-214 11:37:08
 */
public interface SysFormService{

    /** 逻辑删除 */
    Boolean deleteSysForm(Long id);

    /** 物理删除 */
    Boolean deleteSysFormChild(String tableName);

    /** 批量逻辑删除 */
    String batchDeleteSysForm(Collection<Long> ids);

    /** 启用表单 */
    Boolean enable(Long id);

    /** 禁用表单 */
    Boolean disable(Long id);

    /** 取消引用 */
    Boolean noRelease(Long id);

    /** 批量取消引用 */
    String noReleaseBatch(Collection<Long> ids);

    /**
     * 获得表单分页列表
     *
     * @param reqVO 分页条件
     * @return 分页列表
     */
    PageResult<SysFormItemRespVO> getFormPage(SysFormReqVO reqVO);

    /**
     * 通过表单 ID 查询表单
     *
     * @param id 表单ID
     * @return 表单对象信息
     */
    SysFormDO getSysForm(Long id);

    /**
     * 创建表单
     *
     * @param formDO 表单信息
     * @return 表单编号
     */
    Long createForm(@Valid SysFormDO formDO);

    /**
     * 修改表单
     *
     * @param formDO 表单信息
     */
    void updateForm(@Valid SysFormDO formDO);

    /**
     * 根据表单名获取表单信息
     *
     * @param formName 表单名
     * @return SysFormDO
     */
    SysFormDO selectOne(String formName);

    /**
     * 获取当前表菜单
     *
     * @param tableName 表单名
     * @return SysFormDO
     */
    CommonResult getByFormMenu(String tableName);


    /**
     * 根据表名获取表单信息
     *
     * @param tableName 表名
     * @return SysFormDO
     */
    SysFormDO selectOneByTableName(String tableName);

    /**
     * 获得已发布表单分页列表
     *
     * @param reqVO 分页条件
     * @return 分页列表
     */
    PageResult<SysFormItemRespVO> getFormPageRelease(SysFormReqVO reqVO);

    /**
     * 获得未发布表单分页列表
     *
     * @param reqVO 分页条件
     * @return 分页列表
     */
    PageResult<SysFormItemRespVO> getFormPageNoRelease(SysFormReqVO reqVO);

    /**
     * 获取表单属性和组件属性
     *
     * @param formId  表单id
     * @return 表单属性和组件属性
     */
    BpmForm getFormConfig(Long formId);

    /**
     * 获取表单信息
     *
     * @param formIds  表单ids
     * @return 表单属性和组件属性
     */
    Map<Long, SysFormDO> getFormMap(Set<Long> formIds);

    /**
     * 获得动态表单列表
     *
     * @param ids 编号
     * @return 动态表单列表
     */
    List<SysFormDO> getFormList(Collection<Long> ids);

    /**
     * 获取已发布表单，数据源使用
     *
     * @return 表单列表
     */
    List<SysFormDO> selectListRelease();

    List<SysFormDO> selectListReleaseByEncode(String tableName);

    /**
     * 获取全部表单，数据源使用
     *
     * @return 表单列表
     */
    List<SysFormDO> selectListAll();

    Long getFormIdByTableName(String tableName);

    Set<Long> getUserMenuId();


    List<SysFormDO> getSysFormByUseMenuIds(String menuIds);

    List<SysFormDO> getChildSysFormByIds(Long parentId);

    Set<SysFormDO> getSysFormByFormMenuIds(String menuIds);

    Set<Long> getManageMenuId();

    List<SysFormDO> selectListReleaseManage();
    /**
     * 获得表单分页列表启用
     *
     * @param reqVO 分页条件
     * @return 分页列表
     */
    PageResult<SysFormItemRespVO> getSysFormPageIsenable(SysFormReqVO reqVO);

    SysFormDO selectById(Long formId);


    List<Map<String,Object>> getFieldNameList(String tableName);
}
